home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / REGTEST.PAK / REGTEST.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  8KB  |  239 lines

  1. //----------------------------------------------------------------------------
  2. // ObjectComponents - (C) Copyright 1994 by Borland International
  3. // OLE registration test
  4. //----------------------------------------------------------------------------
  5. #include "ocf/ocreg.h"
  6. #include "regtest.rh"
  7.  
  8. #if !defined(BI_PLAT_WIN16)
  9. inline int GetTextExtent(HDC hDC, const char* buf, int len) {
  10.   SIZE s;
  11.   GetTextExtentPoint(hDC, buf, len, &s);
  12.   return s.cx;  // return width portion
  13. }
  14. #endif
  15.  
  16. //____________________________________________________________________________
  17. //
  18. //  Example registration tables
  19. //____________________________________________________________________________
  20.  
  21. REGISTRATION_FORMAT_BUFFER(100)
  22.  
  23. BEGIN_REGISTRATION(myappreg)
  24.  REGDATA(clsid,      "{01234567-1234-5678-1122-334455667788}")
  25.  REGDATA(progid,     "MySample.Application.1")
  26.  REGDATA(description,"My Sample 1.0 Application")
  27.  REGDATA(appname,    "My Sample 1.0")
  28.  REGDATA(cmdline,    "/automation")
  29.  REGDATA(version,    "1.2")
  30. END_REGISTRATION
  31.  
  32. BEGIN_REGISTRATION(mydocreg)
  33.  REGDATA(description,"My Sample 1.0 Document")
  34.  REGDATA(extension,  "myd")
  35.  REGDATA(directory,  "c:\temp")
  36.  REGDATA(docfilter,  "*.drw;*.drx")
  37.  REGDATA(debugger,   "tdw -l")
  38.  REGDATA(clsid,      "{01234568-1234-5678-1122-334455667788}")
  39.  REGDATA(progid,     "MySample.Document.1")
  40.  REGDATA(menuname,   "Document")
  41.  REGDATA(insertable,0)
  42.  REGDATA(usage,    ocrMultipleUse)
  43.  REGDATA(verb0,      "&Edit")
  44.  REGDATA(verb1,      "&Open")
  45.  REGDATA(verb2,      "&Play")
  46.  REGVERBOPT(verb2, ocrGrayed, ocrOnContainerMenu | ocrNeverDirties)
  47.  REGFORMAT(0, ocrEmbedSource,  ocrContent, ocrIStorage, ocrGet)
  48.  REGFORMAT(1, ocrText,         ocrContent, ocrHGlobal,  ocrGetSet)
  49.  REGFORMAT(2, ocrMetafilePict, ocrContent, ocrMfPict,   ocrGet)
  50.  REGFORMAT(3, ocrRichText,     ocrContent, ocrHGlobal,  ocrGetSet)
  51.  REGSTATUS(all,     ocrNoSpecialRendering)
  52.  REGSTATUS(icon,    ocrOnlyIconic)
  53.  REGSTATUS(content, ocrRecomposeOnResize)
  54.  REGICON(1)
  55.  REGITEM("CLSID\\<clsid>\\Conversion\\Readable\\Main","FormatX,FormatY")
  56. END_REGISTRATION
  57.  
  58. BEGIN_REGISTRATION(mytplreg)
  59.  REGDATA(description,"My Sample Draw View")
  60.  REGDATA(filter,     "*.drw;*.drx")
  61.  REGDATA(defaultext, "DVW")
  62.  REGDATA(directory,  0)
  63. END_REGISTRATION
  64.  
  65. TRegItem regAppName[2] = {{"appname",{myappreg["appname"]}}, {0,{0}}};
  66.  
  67. //____________________________________________________________________________
  68. //
  69. //  Example registration table processing
  70. //____________________________________________________________________________
  71.  
  72. TRegList* MyRegClasses[] = { &myappreg, &mydocreg, 0 };
  73.  
  74. const char*
  75. RegisterClasses(TRegList** regClasses, // null-term. array of reg lists
  76.                 HINSTANCE module,      // 0 defaults to current task
  77.                 ostream& out,          // open ostream to stream reg entries
  78.                 TLangId lang = LangSysDefault, // language for registration
  79.                 char* filter = 0,      // internal use to restrict entries
  80.                 TRegItem* defaults = regAppName)// optional registration default list
  81. {
  82.   // write registration file header
  83.   //
  84.   out << "REGEDIT\n";
  85.  
  86.   // loop to register each class
  87.   //
  88.   for ( ; *regClasses != 0; regClasses++) {
  89.     try {
  90.       ::OcRegisterClass(**regClasses, module, out, lang, filter, defaults);
  91.     }
  92.     catch (TXRegistry& xcpt) {
  93.       return xcpt.Key;
  94.     }
  95.   }
  96.   return 0;
  97. }
  98.  
  99. int UnregisterClasses(TRegList** regClasses)
  100. {
  101.   int  errorCount = 0;
  102.   for ( ; *regClasses != 0; regClasses++) {  // loop to unregister each class
  103.     errorCount += OcUnregisterClass(**regClasses);
  104.   }
  105.   return errorCount;
  106. }
  107.  
  108. //____________________________________________________________________________
  109. //
  110. //  Example code to exercise registration
  111. //____________________________________________________________________________
  112.  
  113. #include <fstream.h>
  114. #include <strstrea.h>
  115.  
  116. #define WM_USERSTAT (WM_USER + 100)
  117.  
  118. bool CALLBACK __export
  119. DlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
  120. {
  121.   if (msg == WM_INITDIALOG) {
  122.     return 1;
  123.   } else if (msg == WM_COMMAND) {
  124.     ::PostMessage(hDlg, WM_USERSTAT, wParam, lParam);
  125.     return 1;
  126.   } else if (msg == WM_CLOSE) {
  127.     ::PostMessage(hDlg, WM_USERSTAT, IDABORT, 0);
  128.     return 1;
  129.   } else if (msg == WM_DESTROY) {
  130.     ::PostMessage(hDlg, WM_USERSTAT, IDABORT, 0);
  131.     return 1;
  132.   }
  133.   return 0;
  134. }
  135.  
  136. int PASCAL
  137. WinMain(HINSTANCE hInst, HINSTANCE/*prev*/, char far* /*cmdLine*/, int/*show*/)
  138. {
  139.   HWND hWnd = ::CreateDialog(hInst, MAKEINTRESOURCE(IDD_MAIN), 0, (DLGPROC)DlgProc);
  140.   if (!hWnd) {
  141.     ::MessageBox(0, "Could Not Create Dialog Box", "Error", MB_OK);
  142.     return 1;
  143.   }
  144.   for (;;){
  145.     try {
  146.       MSG msg;
  147.       int id = 0;
  148.       while (!id && ::GetMessage(&msg, 0, 0, 0)) {
  149.         if (msg.message == WM_USERSTAT)
  150.           id = msg.wParam;
  151.         else
  152.           ::IsDialogMessage(hWnd, &msg);
  153.       }
  154.       if (id == IDABORT || id == IDOK)
  155.         break;
  156.       int errorCount = 0;
  157.       const char* errorText = 0;
  158.       switch (id) {
  159.         case IDC_DISPLAY:  { // Show reg entries in listbox
  160.           ::SendDlgItemMessage(hWnd, IDC_REGLIST, LB_RESETCONTENT, 0, 0);
  161.           strstream strm;
  162.           errorText = RegisterClasses(MyRegClasses, hInst, strm);
  163.           if (errorText) {
  164.             break;
  165.           }
  166.           char buf[512];
  167.           strm.getline(buf, sizeof(buf)); // skip reg file header written above
  168.           int maxlen = 0;
  169.           HDC hDC = ::GetDC(hWnd);
  170.           HFONT hFont = (HFONT)::SendDlgItemMessage(hWnd, IDC_REGLIST, WM_GETFONT,0,0);
  171.           HFONT oldFont = (HFONT)::SelectObject(hDC, hFont);
  172.           while (!strm.eof()) {
  173.             strm.getline(buf, sizeof(buf));
  174.             ::SendDlgItemMessage(hWnd, IDC_REGLIST, LB_ADDSTRING,
  175.                                        0, (LPARAM)(char far*)buf);
  176.             int n = (int)::GetTextExtent(hDC, buf, lstrlen(buf));
  177.             if (n > maxlen)
  178.               maxlen = n;
  179.           }
  180.           ::SelectObject(hDC, oldFont);
  181.           ::ReleaseDC(hWnd, hDC);
  182.           ::SendDlgItemMessage(hWnd, IDC_REGLIST, LB_SETHORIZONTALEXTENT,
  183.                                maxlen, 0);
  184.           break;
  185.         }
  186.         case IDC_REGISTER: { // Write all info to registry
  187.           strstream strm;
  188.           errorText = RegisterClasses(MyRegClasses, hInst, strm);
  189.           if (errorText) {
  190.             break;
  191.           }
  192.           try {
  193.             OcRegistryUpdate(strm);
  194.           }
  195.           catch (TXRegistry& xcpt) {
  196.             errorText = xcpt.Key;
  197.           }
  198.           break;
  199.         }
  200.         case IDC_UNREGISTER: { // Delete all info from registry
  201.           errorCount = UnregisterClasses(MyRegClasses);
  202.           break;
  203.         }
  204.         case IDC_WRITEFILE: { // Write registration file
  205.           ofstream out;
  206.           out.open("myapp.reg");
  207.           errorText = RegisterClasses(MyRegClasses, hInst, out);
  208.           out.close();
  209.           break;
  210.         }
  211.         case IDC_VERIFY: { // Validate registration file with single check
  212.           strstream strm;
  213.           RegisterClasses(MyRegClasses, hInst, strm,LangSysDefault,"\001");
  214.           errorCount = OcRegistryValidate(strm);
  215.           break;
  216.         }
  217.         case IDC_COMPARE: { // Validate entire registration file
  218.           strstream strm;
  219.           RegisterClasses(MyRegClasses, hInst, strm);
  220.           errorCount = OcRegistryValidate(strm);
  221.           break;
  222.         }
  223.         default:
  224.           continue;
  225.       }
  226.       char buf[40];
  227.       ::GetDlgItemText(hWnd, id, buf, sizeof(buf)-1);
  228.       ::SetDlgItemText(hWnd, IDC_OP, buf);
  229.       if (!errorText)
  230.         wsprintf(((char*)errorText = buf), "%d", errorCount);
  231.       ::SetDlgItemText(hWnd, IDC_ERRORS, buf);
  232.     }
  233.     catch (TXBase& x) {
  234.       ::MessageBox(0, x.why().c_str(), "OLE Exception", MB_OK);
  235.     }
  236.   }
  237.   return 0;
  238. }
  239.